在开始 EAS 系统的设计与开发之后,客户的需求又引入了培训功能,希望通过培训提高开发人员的技能水平。由于培训业务相对独立,因而为其单独建立了培训上下文(Training Context)。这个独立的培训上下文牵涉到相对复杂的业务流程与业务规则,非常适合用于描述完整的领域建模过程。因此,从本章开始,我将完整介绍培训上下文的业务需求,并利用事件风暴结合场景驱动设计和测试驱动开发,完整地展示该上下文领域分析建模、领域设计建模和领域实现建模的过程。
培训的目的是为了提高员工的技能水平,需要根据员工的职业规划与企业发展制定培训计划(Training Plan),开展培训。培训的整个管理由人力资源部的培训专员(Program Owner)负责。在培训流程中,除了培训专员,还牵涉到部门协调者(DU Coordinator)、员工主管(Report Manager)和员工(Employee)本人。
系统将分配给员工的培训机会称之为票(Ticket),这实际上是领域概念的一种隐喻。培训专员发起培训的过程,实际上就是分配票的过程,整个流程如下图所示:
培训专员在分配票之前,会事先设定过滤器和有效日期。过滤器主要用于过滤员工名单,获得一个与该培训相匹配的培训提名(Nomination)候选名单。培训专员设置的有效日期主要用于判断票的有效期限。培训专员会将票分配给部门协调者,再由部门协调者将票分配给员工。员工在收到培训邮件后,可以选择“确认”或“拒绝”,若员工拒绝了分配的票,票会退回给部门协调者,由部门协调者对票进行再分配。
在发起培训开始,到培训结束,一共有四个重要的截止时间(Deadline):
在不同的截止日期,员工取消(Cancel)票的流程都不一样,处理票的规则也不相同:
在提名截止时间之前,员工可以取消票。取消后,系统会分别发送邮件给部门协调者与员工主管,只要任意一人批准了该取消请求,就认为取消成功,该票又会恢复到可用状态。在缺席截止时间之前,员工可以取消票。取消后,系统会发送邮件通知部门协调者和员工主管,但无需他们审批,而是直接由培训专员负责处理该票。处理票时,会先检查分配该票时设置的活动(Action)策略,要么由系统自动处理,要么由培训专员处理该票。处理票有三种活动策略:
在培训开始前,不允许员工再显式地取消票。如果员工在收到票后一直未确认,系统会检查分配该票时设置的策略,要么由系统自动处理,要么由培训专员处理该票,处理票的策略与前相同。一旦培训开始后,就不再允许员工取消票,如果有事未能出席,应提交请假申请。
部门协调者在将票分配给员工后,也可以取消已经分配出去的票。不同截止日期的取消流程不同,如下图所示:
部门协调者取消票的流程与员工取消票的流程比较相似,不同之处在于取消票时无需审批,直接就可处理。在报名截止日期之间,处理票的策略有三种:
这里的提名备选名单(Backup)就是之前设置过滤器生成的提名候选名单中,剔除掉已经被提名的员工列表。
培训专员也可以取消票,流程如下图所示:
该执行流程与部门协调者取消票的流程几乎完全相同,这里不再赘述。
培训期间,每个参与培训的员工都要签到(Checkin)。培训结束后,系统会比较培训提名名单与出勤记录,由此可以获得缺席(No Show)列表。培训专员确认了缺席列表后,会根据黑名单规则确定是否将该员工放入到黑名单(Black List)中。若员工被列入到培训黑名单,在将来就不会再出现在培训候选名单中,除非又被移出了黑名单。流程如下图所示:
显然,分配票的业务流程相对简单,复杂之处在于取消票的流程,不同阶段不同角色的取消操作会产生不同的结果,从而带来票状态的变更。在分析业务需求时,梳理票状态的变更很有必要。票的状态迁移以及触发状态迁移的动作如下图所示:
票在分配给员工后,状态为“等待确认(WaitForConfirm)”。若员工一直不确认,当时间到达培训专员截止时间(PO Deadline)时,状态就变更为“截止(Deadline)”。若员工拒绝,状态变更为“已拒绝(Declined)”,否则就确认为“已注册(Enrolled)”状态。在该状态下,若培训专员确认,状态变更为“已确认(Confirmed)”状态。若票已确认,而员工未参与培训,又或者在缺席截止时间之后取消,状态置为“缺席(NoShow)”,若正常参加培训,最后状态为“关闭(Closed)”。
在缺席截止时间之前,若票的状态为“等待确认(WaitForConfirm)”,那么培训专员、部门协调者与员工主管都可以取消票,状态变更为“已取消(Cancelled)”。在“已注册(Enrolled)”或“已确认(Confirmed)”状态下,只要当前时间在培训专员截止时间之前,培训专员、部门协调者与员工主管也可以取消票;员工自己也可以取消,但状态会变更为“等待审批(WaitForApprove)”。此时,倘若部门协调者或员工主管不批准,则票的状态变更为“已确认(Confirmed)”,如果批准了,又或者在24小时内没有执行任何操作,状态就变更为“已取消(Cancelled)”。处于“已取消(Cancelled)”状态的票如果被再分配(reassign),就会重新回到起点——“等待确认(WaitForConfirm)”,否则认为该票作废,状态为“作废(Lost)”。
有效日期(Valid Date)的设置与系统自动触发的活动有关,直接影响了培训流程。通常,在创建一个培训(Training)时,系统会自动将培训的开始时间作为其中一个系统类型的有效日期。同时,系统会为培训专员创建两个系统类型的有效日期:
系统还为部门协调者创建一个系统类型的有效日期:主管截止时间(Manager Deadline),用户也可以添加自定义的有效日期。在添加有效日期时,除了可以指定日期和时间之外,还可以定义日期时间的计算公式。
在设置了有效日期之后,用户还可以设置当有效日期满足条件会触发的活动(Action)策略。活动策略包括:
除了可以为有效日期设置处理票的活动策略之外,在培训专员或其他角色分配票时也可以设置这些活动,作为取消票时对票的处理策略。
培训上下文的业务需求在一些领域概念上存在模糊不清的定义,需要为它们确定统一语言,以扫清领域建模工作的障碍。
对于培训票(Ticket),培训专员可以将票“分配”给部门协调者,部门协调者在得到票后,又可以将票再“分配”给别的协调者,也可以将票直接“分配”给员工。虽然都是在“分配”票,含义却完全不同。为避免这两个概念的混淆,可以将票直接分配给员工的操作视为对员工的提名(Nomination)。于是明确了如下概念:
对于部门的员工而言,在不同场景也具有不同的身份,体现了员工与培训的不同关系: